home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / init.c < prev    next >
C/C++ Source or Header  |  1993-03-18  |  25KB  |  1,200 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5. #include    "doslib.h"
  6.  
  7. extern COMMAND_UNIT command_table[MAX_COMMAND_NUMBER];
  8. extern COMMAND_UNIT command_table0[MAX_COMMAND_NUMBER];        /* ME */
  9. extern COMMAND_UNIT command_table1[MAX_COMMAND_NUMBER];        /* ED */
  10. extern COMMAND_UNIT command_table00[MAX_COMMAND_NUMBER];    /* ME */
  11. extern COMMAND_UNIT command_table10[MAX_COMMAND_NUMBER];    /* ED */
  12.  
  13. extern int LCN;
  14. extern UBYTE argv0[MAXLINE];
  15. extern UBYTE options[MAX_OPTION][MAXLINE];
  16. extern WORD UNDER_FLAG;
  17. extern int kigou_new_flag;
  18. extern UWORD fep_xf_bind_table[MAX_XF];
  19.  
  20. /* 初期化 */
  21.  
  22. UBYTE tpbody[MAXLINE],apbody[MAXLINE],kpbody[MAXLINE];
  23.  
  24. void
  25. init_parameters()
  26. {
  27.     FILE *fp;
  28.     STR tp,ap,kp;
  29.     struct NAMECKBUF inf;
  30.     int oc = 0;
  31.  
  32.     *apbody = *tpbody = *kpbody = EOS;
  33.     while(*options[oc]) {
  34.         NAMECK(&options[oc][1],&inf);
  35.         if (!strcmp(etc_jstrup(inf.ext),".CNF")) {
  36.             strcpy(tpbody,&options[oc][1]);        /* CONFIG FILE があった */
  37.         } else if (!strcmp(etc_jstrup(inf.ext),".ASK")) {
  38.             strcpy(apbody,&options[oc][1]);        /* XF キーバインド FILE があった */
  39.         } else if (!strcmp(etc_jstrup(inf.ext),".KEY")) {
  40.             strcpy(kpbody,&options[oc][1]);        /* コマンドキーバインド FILE があった */
  41.         } else if (!strcmp(etc_jstrup(&options[oc][1]),"RAW")) {
  42.             RAW_FLAG = 1;                /* 生(属性を無視)である */
  43.         } else if (!strcmp(etc_jstrup(&options[oc][1]),"DUM")) {
  44.             DUM_FLAG = 1;                /* ダミー(内部で変換しない)である */
  45.         }
  46.         oc++;
  47.     }
  48.  
  49.     if (!*tpbody && ((tp = (STR)getenv("TWPATH")) || (tp = (STR)getenv("twpath")))) {    /* 環境指定があった */
  50.         strcpy(tpbody,tp);
  51.         strcat(tpbody,"TW.CNF");
  52.     }
  53.  
  54.     if (!*apbody && ((ap = (STR)getenv("TWPATH")) || (ap = (STR)getenv("twpath")))) {    /* 環境指定があった */
  55.         strcpy(apbody,ap);
  56.         strcat(apbody,"TW.ASK");
  57.     }
  58.  
  59.     if (!*kpbody && ((kp = (STR)getenv("TWPATH")) || (kp = (STR)getenv("twpath")))) {    /* 環境指定があった */
  60.         strcpy(kpbody,kp);
  61.         strcat(kpbody,"TW.KEY");
  62.     }
  63.  
  64.     init_try_ap();    /* 生指定か、TWPATH から得た物を試す */
  65.     if (!*apbody) {        /* さもなきゃ、TW.X のあった所 */
  66.         NAMECK(argv0,&inf);
  67.         strncpy(apbody,inf.drive,2);
  68.         apbody[2] = EOS;
  69.         strcat(apbody,inf.path);        /* パスを得る */
  70.         strcat(apbody,"TW.ASK");
  71.         init_try_ap();    /* 生指定か、TWPATH から得た物を試す */
  72.     }
  73.     fep_mode_set(FP_MODE);
  74.  
  75.     init_try_kp();    /* 生指定か、TWPATH から得た物を試す */
  76.     if (!*kpbody) {        /* さもなきゃ、TW.X のあった所 */
  77.         NAMECK(argv0,&inf);
  78.         strncpy(kpbody,inf.drive,2);
  79.         kpbody[2] = EOS;
  80.         strcat(kpbody,inf.path);        /* パスを得る */
  81.         strcat(kpbody,"TW.KEY");
  82.         init_try_kp();    /* 生指定か、TWPATH から得た物を試す */
  83.     }
  84.     init_try_tp();    /* 生指定か、TWPATH から得た物を試す */
  85.     if (!*tpbody) {    /* さもなきゃ、TW.X のあった所 */
  86.         NAMECK(argv0,&inf);
  87.         strncpy(tpbody,inf.drive,2);
  88.         tpbody[2] = EOS;
  89.         strcat(tpbody,inf.path);        /* パスを得る */
  90.         strcat(tpbody,"TW.CNF");
  91.         init_try_tp();    /* 生指定か、TWPATH から得た物を試す */
  92.     }
  93.     if (!*tpbody) {    /* CNF ファイルがない */
  94.         CURRENT_JIZUME=90;
  95.         CURRENT_CHANGED=0;
  96.         LYW_UPPER = LYW_UNDER = 0;/* LWIDTH=0 */
  97.         PAGE = 0;
  98.         CR_VIEW = 1;        /* 改行を表示するか *//* CR=1 */
  99.         TAB_LENGTH_1 = (TAB_LENGTH = 8) -1;/* TAB=8,0 */
  100.         TAB_VIEW = 0;
  101.         CURRENT_BAK = 1;    /* ~.BAK を作るのか? *//* BAK=1 */
  102.         ctrl_t_ed();        /* ED モード */
  103.     }
  104.     init_set_default();
  105. }
  106.  
  107. /* apbody, tpbody, kpbody を読み込み、設定しようとする */
  108. void
  109. init_try_tp()
  110. {
  111.     FILE *fp;
  112.     int raw_buff;
  113.  
  114.     raw_buff = RAW_FLAG;
  115.     RAW_FLAG = 0;
  116.     if (fp = fopen((char *)tpbody,"rb")) {        /* CNF ファイルがあった */
  117.         if (init_by_cnf_tn(fp,NULL,1,CURRENT_TEXT)) {    /* ちゃんとした CNF ファイルであった */
  118.             fclose(fp);
  119.         } else {
  120.             if (!RAW_FLAG) {
  121.                 error("コンフィグファイルが異常です");
  122.             }
  123.         }
  124.     } else {
  125.         *tpbody = EOS;
  126.     }
  127.     RAW_FLAG = raw_buff;
  128. }
  129.  
  130. void
  131. init_try_ap()
  132. {
  133.     FILE *fp;
  134.  
  135.     init_xf_bind_table();
  136.     if (fp = fopen((char *)apbody,"rb")) {    /* ASK ファイルがあった */
  137.         init_by_env(fp);
  138.         fclose(fp);
  139.     } else {
  140.         *apbody = EOS;
  141.     }
  142. }
  143.  
  144. void
  145. init_try_kp()
  146. {
  147.     FILE *fp;
  148.  
  149.     if (fp = fopen((char *)kpbody,"rb")) {    /* KEY ファイルがあった */
  150.         init_key_bind(fp);
  151.         fclose(fp);
  152.     } else {
  153.         *kpbody = EOS;
  154.     }
  155. }
  156.  
  157.  
  158. void
  159. init_set_default()
  160. {
  161.     DEFAULT_DATA.JIZUME = CURRENT_JIZUME;
  162.     DEFAULT_DATA.BAK_FLAG = CURRENT_BAK;
  163. }
  164.  
  165. /* tn をデフォルトにする */
  166. void
  167. init_get_default_tn(int tn)
  168. {
  169.  
  170.     TDATA[tn].JIZUME = DEFAULT_DATA.JIZUME;
  171.     TDATA[tn].BAK_FLAG = DEFAULT_DATA.BAK_FLAG;
  172. }
  173.  
  174. int
  175. init_by_cnf_or_default_tn(FILE *fp,STR d,int tn)
  176. {
  177.     if (!init_by_cnf_tn(fp,d,0,tn)) {
  178.         init_get_default_tn(tn);
  179.     }
  180. }
  181.  
  182. STR INIT_PARAMETERS[] = {
  183. "WIDTH","LWIDTH",
  184. "PAGE",
  185. "CR","TAB",
  186. "BAK",
  187. "MODE",
  188. ""
  189. };
  190.  
  191. STR PRN_INIT_PARAMETERS[] = {
  192. "TYPE",
  193. "PIN","MSBUP",
  194. "HDOT","VDOT",
  195. "HGAP","VGAP",
  196. "LEFT_MARGIN","UP_MARGIN",
  197.  
  198. "CRLF","FF","GIN","INIT","RESET",
  199. ""
  200. };
  201.  
  202. void
  203. init_by_cnf_sub_tn(STR s,int tn)
  204. {
  205.     STR p;
  206.  
  207.     if (p = strchr(s,':')) {
  208.         *p = EOS;    /* ':' の後ろは注釈 */
  209.     }
  210.     if (p = strchr(s,'[')) {
  211.         STR p0;
  212.  
  213.         if (p0 = strchr(s,']')) {
  214.             
  215.             if (!init_by_cnf_sub0(p+1,tn) && !init_by_cnf_sub00(p+1,tn)) {
  216.                     /* 失敗した */
  217.                 error("コンフィグレーションに失敗しました");
  218.                 return;
  219.             }
  220.         } else {    /* 閉じてない! */
  221.             error("コンフィグレーションで対応すべき']'がありません");
  222.             return;
  223.         }
  224.         init_by_cnf_sub_tn(p0+1,tn);    /* 再帰する */
  225.     }
  226. }
  227.  
  228. /* 成功したかどうかを返す */
  229. int
  230. init_by_cnf_sub0(STR s,int tn)
  231. {
  232.     int i;
  233.     STR p;
  234.  
  235.     i = 0;
  236.     while(1) {
  237.         if (*INIT_PARAMETERS[i]) {
  238.             p = strstr(s,INIT_PARAMETERS[i]);
  239.             if (p == s) {    /* 一致した */
  240.                 p += strlen(INIT_PARAMETERS[i])+1;
  241.                 break;
  242.             }
  243.              i++;
  244.         } else {
  245.             return(0);
  246.         }
  247.     }
  248.  
  249.     switch(i) {
  250.     int ww;
  251.     int LYW_UPPER_w,LYW_UNDER_w;
  252.  
  253.     case 0:        /* WIDTH */
  254.         TDATA[tn].JIZUME = max(16,min(atoi(p),90));
  255.         break;
  256.  
  257.     case 1:        /* LWIDTH */
  258.         if (ctrl_t_lyw_work_check()) {    /* 2つ以上のウインドウがある */
  259.             break;
  260.         }
  261.         ww = atoi(p);
  262.         LYW_UPPER_w = (ww & 1) ? LYW_UPPER0:0;
  263.         LYW_UNDER_w = (ww & 2) ? LYW_UNDER0:0;
  264.         if ((LYW_UPPER_w != LYW_UPPER) || (LYW_UNDER_w != LYW_UNDER)) {
  265.             ctrl_t_lyw_work(LYW_UPPER_w,LYW_MAIN0,LYW_UNDER_w);
  266.         }
  267.         break;
  268.  
  269.     case 2:        /* PAGE */
  270.         PAGE = atoi(p);
  271.         break;
  272.  
  273.     case 3:        /* CR */
  274.         if (ctrl_t_lyw_work_check()) {    /* 2つ以上のウインドウがある */
  275.             break;
  276.         }
  277.         CR_VIEW = atoi(p);
  278.         disp_cr_mode();
  279.         ctrl_l();
  280.         break;
  281.  
  282.     case 4:        /* TAB */
  283.         if (ctrl_t_lyw_work_check()) {    /* 2つ以上のウインドウがある */
  284.             break;
  285.         }
  286.     {
  287.         int w0,w1;    /* おおう、scanf は int へのポインタでないといけない */
  288.         int vflag;
  289.  
  290.         w0 = atoi(p);
  291.         if (p = strchr(p,',')+1) {
  292.             w1 = atoi(p);
  293.         }
  294.         w1 = (!!w1);
  295.         vflag = (TAB_VIEW != w1);
  296.         TAB_VIEW = w1;
  297.         if (TAB_LENGTH != w0) {
  298.             if (CL) {    /* テキストの実体がある */
  299.                 if (!disp_tab_change(w0)) {    /* 変えなかった */
  300.                     if (vflag) {
  301.                         ctrl_l();
  302.                     }
  303.                 }
  304.             } else {    /* テキストの実体がない */
  305.                 etc_set_tab(w0);
  306.             }
  307.         } else if (vflag) {
  308.             ctrl_l();
  309.         }
  310.     }
  311.         break;
  312.  
  313.     case 5:        /* BAK */
  314.         TDATA[tn].BAK_FLAG = atoi(p);
  315.         break;
  316.  
  317.     case 6:        /* MODE */
  318.         etc_jstrup(p);
  319.         if ((p[0] == 'E') && (p[1] == 'D')) {
  320.             ctrl_t_ed0();
  321.         } else if ((p[0] == 'M') && (p[1] == 'E')) {
  322.             ctrl_t_me0();
  323.         }
  324.         break;
  325.  
  326.     default:    /* ??? */
  327.         return(0);
  328.     }
  329.     return(1);
  330. }
  331.  
  332. /* 成功したかどうかを返す */
  333. int
  334. init_by_cnf_sub00(STR s,int tn)
  335. {
  336.     int i;
  337.     STR p;
  338.  
  339.     i = 0;
  340.     while(1) {
  341.         if (*PRN_INIT_PARAMETERS[i]) {
  342.             p = strstr(s,PRN_INIT_PARAMETERS[i]);
  343.             if (p == s) {    /* 一致した */
  344.                 p += strlen(PRN_INIT_PARAMETERS[i])+1;
  345.                 break;
  346.             }
  347.              i++;
  348.         } else {
  349.             return(0);
  350.         }
  351.     }
  352.  
  353.     if (!(sysflag & 0b1)) {    /* 無視すべき */
  354.         return(1);
  355.     }
  356. /*
  357. window0();
  358. printf("((%d))",i);binkey();
  359. */
  360.     switch(i) {
  361.  
  362. /*"TYPE","PIN","MSBUP","HDOT","VDOT",*/
  363. /*"HGAP","VGAP","LEFT_MARGIN","UP_MARGIN",*/    /* この4つだけ */
  364. /*"CRLF","FF","GIN","INIT","RESET",*/
  365.  
  366.     case 5:        /* HGAP */
  367.         PRN_H_PITCH = atoi(p);
  368.         break;
  369.  
  370.     case 6:        /* VGAP */
  371.         PRN_V_PITCH = min(atoi(p),50);
  372.         break;
  373.  
  374.     case 7:        /* LEFT_MARGIN */
  375.         PRN_LEFT_MARGIN = atoi(p);
  376.         break;
  377.  
  378.     case 8:        /* UP_MARGIN */
  379.         PRN_UP_MARGIN = atoi(p);
  380.         break;
  381.  
  382.     default:    /* ??? */
  383.         return(0);
  384.     }
  385.     return(1);
  386. }
  387.  
  388.  
  389.  
  390.  
  391. /* コンフィグファイルに従ってパラメータを設定する */
  392. /* コンフィグでなかった場合は、最初の一行を d に返す */
  393. /* 文書の先頭でも使う(flag = 0) */
  394. int
  395. init_by_cnf_tn(FILE *fp,STR d,int flag,int tn)
  396. {
  397.     UBYTE s[MAXLINE],w[MAXLINE];
  398.  
  399.     if (RAW_FLAG) {
  400.         return(0);
  401.     }
  402.     fgets((char *)s,MAXLINE,fp);
  403.     if (strcmp(s,"[This is a ThunderWord Text]\x0d\x0a")) {
  404.         if (d) {
  405.             strcpy(d,s);
  406.         }
  407.         return(0);
  408.     }
  409.  
  410.     while(!feof(fp)) {
  411.         fgets((char *)s,MAXLINE,fp);
  412.         if (strcmp(s,"[ThunderWord Control End]\x0d\x0a")) {    /* まだ終わりではない */
  413.             init_by_cnf_sub_tn(s,tn);
  414.         } else {
  415.             break;
  416.         }
  417.     }
  418.  
  419.     if (flag) {    /* モロにコンフィグファイルである */
  420.             /* プリンタ関係のパラメータが続く */
  421.         while(!feof(fp)) {
  422.             fgets((char *)s,MAXLINE,fp);
  423.             if (!strcmp(s,"(This is ThunderWord Printer Information)\x0d\x0a")) {
  424.                 while(!feof(fp)) {
  425.                     fgets((char *)s,MAXLINE,fp);
  426.                     if (strcmp(s,"(ThunderWord Printer Information End)\x0d\x0a")) {
  427.                         init_by_cnf_prn(s);
  428.                     } else {
  429.                         break;
  430.                     }
  431.                 }
  432.             }
  433.         }
  434.     }
  435.     return(1);
  436. }
  437.  
  438. void
  439. init_by_cnf_prn(STR s)
  440. {
  441.     STR p;
  442.  
  443.     if (p = strchr(s,':')) {
  444.         *p = EOS;    /* ':' の後ろは注釈 */
  445.     }
  446.     if (p = strchr(s,'(')) {
  447.         STR p0;
  448.  
  449.         if (p0 = strchr(s,')')) {
  450.             if (!init_by_cnf_prn0(p+1)) {    /* 失敗した */
  451.                 error("プリンタの設定に失敗しました");
  452.                 return;
  453.             }
  454.         } else {    /* 閉じてない! */
  455.             error("プリンタの設定で対応すべき')'がありません");
  456.             return;
  457.         }
  458.         init_by_cnf_prn(p0+1);    /* 再帰する */
  459.     }
  460. }
  461.  
  462. /* 成功したかどうかを返す */
  463. int
  464. init_by_cnf_prn0(STR s)
  465. {
  466.     int i;
  467.     STR p;
  468.  
  469.     i = 0;
  470.     while(1) {
  471.         if (*PRN_INIT_PARAMETERS[i]) {
  472.             p = strstr(s,PRN_INIT_PARAMETERS[i]);
  473.             if (p == s) {    /* 一致した */
  474.                 p += strlen(PRN_INIT_PARAMETERS[i])+1;
  475.                 break;
  476.             }
  477.             i++;
  478.         } else {
  479.             return(0);
  480.         }
  481.     }
  482.  
  483.     switch(i) {
  484.     case 0:        /* TYPE */
  485.         PRN_TYPE = atoi(p);
  486.         prnt_set_type();    /* デフォルトを設定する */
  487.         break;
  488.  
  489.     case 1:        /* PIN */
  490.         PRN_PIN = atoi(p);
  491.         break;
  492.  
  493.     case 2:        /* MSBUP */
  494.         PRN_MSB_IS_UP = atoi(p);
  495.         break;
  496.  
  497.     case 3:        /* HDOT */
  498.         PRN_HDOT = atoi(p);
  499.         break;
  500.  
  501.     case 4:        /* VDOT */
  502.         PRN_VDOT = atoi(p);
  503.         break;
  504.  
  505.     case 5:        /* HGAP */
  506.         PRN_H_PITCH = atoi(p);
  507.         break;
  508.  
  509.     case 6:        /* VGAP */
  510.         PRN_V_PITCH = min(atoi(p),50);
  511.         break;
  512.  
  513.     case 7:        /* LEFT_MARGIN */
  514.         PRN_LEFT_MARGIN = atoi(p);
  515.         break;
  516.  
  517.     case 8:        /* UP_MARGIN */
  518.         PRN_UP_MARGIN = atoi(p);
  519.         break;
  520.  
  521.     case 9:        /* CRLF */
  522.         init_by_cnf_prn_hex0(PRN_CRLF,p);
  523.         break;
  524.  
  525.     case 10:    /* FF */
  526.         init_by_cnf_prn_hex0(PRN_FF,p);
  527.         break;
  528.  
  529.     case 11:    /* GIN */
  530.         init_by_cnf_prn_hex_gin(PRN_GIN,p);
  531.         break;
  532.  
  533.     case 12:    /* INIT */
  534.         init_by_cnf_prn_hex0(PRN_INIT,p);
  535.         break;
  536.  
  537.     case 13:    /* RESET */
  538.         init_by_cnf_prn_hex0(PRN_RESET,p);
  539.         break;
  540.  
  541.     default:    /* ??? */
  542.         return(0);
  543.     }
  544.     return(1);
  545. }
  546.  
  547. void
  548. init_by_cnf_prn_hex_gin(STR d,STR p)
  549. {
  550.     init_by_cnf_prn_hex0(d,p);
  551.     if (p = strchr(p,'%')) {
  552.         d += strlen(d) + 1;    /* EOS を越える */
  553. /* %?d, %?m, %?i */
  554.         *d++ = *(++p) - '0';
  555.         *d++ = *(++p);
  556.         *d = EOS;
  557.     } else {
  558.         error("プリンタのグラフィック印字命令の設定が異常です");
  559.     }
  560. }
  561.  
  562. /* 単純転送 */
  563. void
  564. init_by_cnf_prn_hex0(STR d,STR p)
  565. {
  566.     UBYTE c,c0;
  567.  
  568.     *d = EOS;
  569.  
  570.     while(p) {
  571.         if (*p++ != '$') {
  572.             break;
  573.         } else {
  574.             if (!isxdigit(c = (*p++))) {
  575.                 break;
  576.             }
  577.             if ((c0 = toupper(c)-'0') > 9) {
  578.                 c0 -= 'A'-'0'-10;
  579.             }
  580.  
  581.             if (!isxdigit(c = (*p++))) {
  582.                 break;
  583.             }
  584.             if ((c = toupper(c)-'0') > 9) {
  585.                 c -= 'A'-'0'-10;
  586. /*                c -= 'A'-'0'+10;*/
  587.             }
  588.             *d++ = ((c0 << 4) + c);
  589.         }
  590.     }
  591.     *d = EOS;
  592. }
  593.  
  594. /* 文書の先頭で、コンフィグ部分をスキップする。最初の一行を d に返す */
  595. int
  596. init_skip_cnf(FILE *fp,STR d)
  597. {
  598.     UBYTE s[MAXLINE];
  599.  
  600.     fgets((char *)s,MAXLINE,fp);        /* 最初の1行を読み出す */
  601.     if (!strcmp(s,"[This is a ThunderWord Text]\x0d\x0a")) {    /* 毎度あり */
  602.         if (d) {
  603.             *d = EOS;
  604.         }
  605.         while(1) {
  606.             fgets((char *)s,MAXLINE,fp);
  607.             if (!strcmp(s,"[ThunderWord Control End]\x0d\x0a")) {
  608.                 break;
  609.             }
  610.         }
  611.         return(1);
  612.     } else {
  613.         if (d) {
  614.             strcpy(d,s);
  615.         }
  616.         return(0);
  617.     }
  618. }
  619.  
  620. /* 最初に一度だけ呼ばれる */
  621. void
  622. init_first()
  623. {
  624.     register int i;
  625.  
  626.     B_PRINT("\x1b[>5l");
  627.     LINE_SHORT = 0;
  628. /*    allmem();*/
  629. CL = NIL;
  630.     ctrl_t_lyw_work0(LYW_UPPER,LYW_MAIN0,LYW_UNDER);
  631.  
  632.     FREE_LINE_COUNTER = 0;        /* フリーリストの行数は0 */
  633.     FREE_HEAD = FREE_TAIL = NIL;    /* フリーリストの初期化 */
  634.  
  635.     for(i=0;i<MAX_TEXT;i++) {    /* テキストポインタを無効化しておく */
  636.         TDATA[i].TEXT_HEADS.MAE = TDATA[i].TEXT_TAILS.ATO = NIL;
  637.         TDATA[i].TEXT_HEADS.ATO = &TDATA[i].TEXT_TAILS;
  638.         TDATA[i].TEXT_TAILS.MAE = &TDATA[i].TEXT_HEADS;
  639.         TDATA[i].TEXT_FILE = -1;
  640.         line_store(&TDATA[i].TEXT_HEADS,(STR)"");
  641.         line_store(&TDATA[i].TEXT_TAILS,(STR)"");
  642.  
  643.         TDATA[i].JIZUME = 64;    /* 字詰めを設定 */
  644.         TDATA[i].TAB_SIZE = 8;    /* タブ数を設定 */
  645.  
  646.         TDATA[i].CHANGED_FLAG = 0;    /* 変更されたかどうかのフラグ */
  647.     }
  648.  
  649.     for(i=0;i<MAX_FILE;i++) {    /* ファイルポインタを無効化しておく */
  650.         FILE_POINTERS[i] = NULL_FP;
  651.         *(FILE_NAMES[i].CONTENT) = EOS;
  652.         *(FILE_NAMES_ST[i].CONTENT) = EOS;
  653.     }
  654.  
  655.     for(i=0;i<MAX_WINDOW;i++) {    /* ウインドウと TEXT への対応を無効化しておく */
  656.         window_set_size(i,-1,-1,-1,-1);
  657.         window_set_position(i,0,0,0);    /* カーソル位置の設定 */
  658.         window_set_text(i,-1);
  659.     }
  660.     window_set_text(0,0);        /* 0番ウインドウを0番テキストに割り当てる */
  661.     window_set_size(0,0,0,XWIDTH-1,YWIDTH-3);    /* 0番をフルサイズに */
  662.     init_screen();
  663.  
  664.     window_set_position(0,0,0,0);
  665.     window_set_current(0);        /* カレントを0番ウインドウにする */
  666.  
  667. /*    HEAD = TAIL = HEAD = NIL;*/
  668.     BAG_LENGTH = 0;            /* 袋の初期化 */
  669.     BAG_HEAD = BAG_TAIL = NIL;    /* bag の頭、尻尾へのポインタを無効化 */
  670.     line_empty_bag((STR) NIL);    /* 袋の初期化 */
  671.  
  672.     CUT_BUFF_HEAD = CUT_BUFF_TAIL = NIL;    /* カットバッファの頭、尻尾へのポインタ */
  673.     CUT_BUFF_HEAD0 = CUT_BUFF_TAIL0 = NIL;
  674.                     /* 整行されたカットバッファの頭、尻尾へのポインタ */
  675.  
  676.     ARG = 0;            /* アーギュメントを無効にする */
  677.  
  678.     etc_set_tab(8);
  679.  
  680.     STRING_ESC1[0] = STRING_ESC2[0] = EOS;
  681.  
  682.     RAW = 9;
  683. /*    RAW = RAW0;*/
  684.     CFUSI = CFUSI0;
  685.     OFUSI = OFUSI0;
  686.     KAKUTEI = KAKUTEI0;
  687.     NORMAL = NORMAL0;
  688.  
  689. /*    CLICK_MODE = 0;*/
  690.     etc_color(NORMAL);
  691.  
  692.     etc_func_on0();
  693.     LCN = -1;    /* 無効化する */
  694.  
  695.     kigou_begin = 0x8140;    /* 記号入力の最初 */
  696.  
  697.     code_input_mode = 0;    /* コード入力は JIS */
  698.     kigou_or_code = 0;
  699.     touroku_hinshi = 17;    /* やっぱ名詞が多いでしょ */
  700.  
  701. #if 0
  702.     CMDMOD = 1;
  703.     ctrl_t_cmd();        /* ひっくり返す */
  704. #endif
  705.     LEDMOD(3,!(K_SFTSNS() & 0b00010000000));
  706.     LEDMOD(3,!(K_SFTSNS() & 0b00010000000));
  707.     ed_big_scall = 0;
  708.     UNDER_FLAG = 0;
  709.  
  710.     for(i=0;i<96*(8+16+4)+64;i++) {
  711.         PAT0[i] = 0;
  712.     }
  713.  
  714.     RAW_FLAG = 0;
  715.  
  716.     kigou_new_flag = 0;
  717.  
  718.     MACRO_DEF_FLAG = MACRO_EXE_FLAG = MACRO_COUNT = 0;
  719.     MACRO_SEQUENCE[MACRO_COUNT] = 0;
  720.     PRN_WAIT = 5;
  721.     PRN_TATE_MODE = 1;
  722.     PRN_JIZUME = 0;
  723.  
  724.     for(i=0;i<MAX_COMMAND_NUMBER;i++) {
  725.         command_table0[i] = command_table00[i];
  726.         command_table1[i] = command_table10[i];
  727.     }
  728.     DUM_FLAG = 0;
  729. }
  730.  
  731. /* 画面の初期化 */
  732. void
  733. init_screen()
  734. {
  735.     int i,t;
  736.  
  737.     init_clear_screen();
  738.     for(i=0;i<YWIDTH;i++) {
  739.         SCREEN[i] = NIL;
  740.     }                /* 全画面クリア */
  741.  
  742.     for(i=0;i<MAX_WINDOW;i++) {
  743.         if ((t = WDATA[i].WTEXTS) >= 0) {
  744.             disp_btm_line(i);
  745.             SCREEN[WDATA[i].WY0] = &TDATA[t].TEXT_TAILS;    /* !!! */
  746.             SCREEN[WDATA[i].WY1+1] = NOT;        /* -1 */
  747.         }
  748.     }
  749.     disp_cursor_on();
  750. }
  751.  
  752. /* 画面の初期化 */
  753. void
  754. init_current_screen()
  755. {
  756.     int i,i0,t,x;
  757.  
  758.     for(i0 = 0,i = CWY0;i <= CWY1;i++,i0++) {
  759.         SCREEN[i] = NIL;
  760.         window_loc(0,i0);
  761.         etc_bit_convert_and_disp(0,i,"");
  762.     }
  763.     t = WDATA[CWN].WTEXTS;
  764.     disp_btm_line(CWN);
  765.     SCREEN[WDATA[CWN].WY0] = &TDATA[t].TEXT_TAILS;    /* !!! */
  766.     SCREEN[WDATA[CWN].WY1+1] = NOT;        /* -1 */
  767. }
  768.  
  769. void
  770. init_clear_screen()
  771. {
  772.     B_CONSOL(0,0,XWIDTH0-1,YWIDTH0-2);
  773.     B_PRINT("\x1a");        /* 画面クリア */
  774. }
  775.  
  776. UBYTE XF_TABLE[][24] = {
  777. "BEGIN=CTRL+XF1",    /* 変換モードに入る */
  778. "END=CTRL+XF1",        /* 無変換モードに入る */
  779. "XFER=XF3",        /* 変換を開始する */
  780. "ENTER=XF5",        /* 全文節を確定する */
  781. "TYPE=F10",        /* */
  782. "DEL=DEL",        /* */
  783. "RIGHT=RIGHT",        /* */
  784. "LEFT=LEFT",        /* */
  785. "HOME=HOME",        /* */
  786. "CLR=CLR",        /* キャンセル */
  787. "CODE=F7",        /* (SHIFT)JIS <-> 句点入力切り替え */
  788. "LEARN=F9",        /* 辞書学習モード */
  789. "DIC=F8",        /* 辞書の変更 */
  790. "HIRAKATA=XF4",        /* ひらがなカタカナ変換 */
  791. "ZENHAN=SHIFT+XF4",    /* 全角半角変換 */
  792. "NEXTKOUHO1=XF3",    /* 次候補1 */
  793. "NEXTKOUHO2=XF3",    /* 次候補2 */
  794. "NEXTKOUHO3=XF3",    /* 次候補3 */
  795. "BACKKOUHO1=SHIFT+XF3",    /* 前候補1 */
  796. "BACKKOUHO2=SHIFT+XF3",    /* 前候補2 */
  797. "BACKKOUHO3=SHIFT+XF3",    /* 前候補3 */
  798. "NEXTBLOCK=DOWN",    /* 次選択群 */
  799. "BACKBLOCK=UP",        /* 前選択群 */
  800. "SHORTER=SHIFT+XF1",    /* 文節を短くする */
  801. "LONGER=SHIFT+XF2",    /* 文節を長くする */
  802. "NEXTBUN=XF2",        /* 次文節へ */
  803. "BACKBUN=XF1",        /* 前文節へ */
  804. "ECHO=F6",        /* */
  805. "DEFECHO=0",        /* */
  806. "DEFROME=1",        /* 起動時はローマ字 */
  807. "DEFKANA=0",        /* 起動時はかな入力 */
  808. "DEFZEN=1",        /* 起動時は全角モード */
  809. "DEFHIRA=1",        /* 起動時はひらがな/カタカナ */
  810. "DEFINS=0",        /* */
  811. "DEFALL=1",        /* */
  812. "DEFMEM=1",        /* 起動時はメモリ/ディスク学習 */
  813. "DEFCONT=0",        /* */
  814. ""
  815. };
  816.  
  817. void
  818. init_xf_bind_table()
  819. {
  820.     register int i;
  821.  
  822.     for(i=0;i<MAX_XF;i++) {
  823.         fep_xf_bind_table[i] = i;
  824. /*        fep_key_bind_table[i] = i;*/
  825.     }
  826.     SP_XFER = 0;
  827. }
  828.  
  829. void
  830. init_by_env(FILE *fp)
  831. {
  832.     UBYTE s[MAXLINE];
  833.     register int i;
  834.  
  835.     while(!feof(fp)) {
  836.         fgets((char *)s,MAXLINE,fp);
  837.         if (strchr(s,'=')) {
  838.             init_by_env_sub(s);
  839.         }
  840.     }
  841.     if (fep_xf_bind_table[32] == 0x103) {
  842.         SP_XFER = 1;
  843.     }
  844. /*
  845. window0();
  846. printf("(%d)",fep_xf_bind_table[32]);
  847. printf("(%d)",fep_xf_bind_table[0x103]);binkey();
  848. */
  849. }
  850.  
  851. void
  852. init_by_env_sub(STR s)
  853. {
  854.     UBYTE w[MAXLINE],w0[MAXLINE];
  855.     STR p,p0;
  856.     register int i;
  857.  
  858.     if (p = strchr(s,':')) {
  859.         *p = EOS;    /* ':' の後ろは注釈 */
  860.     }
  861.     if (p = etc_get_left(s,'=',w)) {    /* w が左 p が右 */
  862.         for(i=0;*XF_TABLE[i];i++) {
  863.             int v,v0;
  864.  
  865.             p0 = etc_get_left(XF_TABLE[i],'=',w0);
  866.             if (strcmp(w,w0)) {
  867.                 continue;
  868.             }
  869.             /* 一致する物が見つかった */
  870.  
  871.             v = init_by_env_val(w);
  872.             if ((*p == '0') || (*p == '1')) {
  873.                 /* フラグパートだ */
  874.                 if (v < 0) {
  875.                     v0 = *p - '0';
  876.                     switch(v) {
  877.                     case -1:    /* DEFROME:起動時はローマ字 */
  878.                     FP_MODE[2] = "-R"[v0];
  879.                     break;
  880.                     case -2:    /* DEFKANA:起動時はかな入力 */
  881.                     FP_MODE[1] = "-K"[v0];
  882.                     break;
  883.                     case -3:    /* DEFZEN:起動時は全角モード */
  884.                     FP_MODE[0] = "HZ"[v0];
  885.                     break;
  886.                     case -4:    /* DEFHIRA:起動時はひらがな/カタカナ */
  887.                     FP_MODE[4] = "-H"[v0];
  888. /*                    LEDMOD(5,v0);*/
  889.                     break;
  890.                     case -5:    /* DEFMEM:起動時はメモリ/ディスク学習 */
  891.                     v0 = !v0;
  892. /*
  893. window0();
  894. printf("(%d)[[%d]]",KNJCTRL(12),v0);binkey();
  895. */
  896.                     if (KNJCTRL(12) != v0) {    /* 学習モードをチェック */
  897.                         KNJCTRL(11,v0);
  898.                     }
  899.                     break;
  900.                     }
  901.                 }
  902.             } else {
  903.                 /* p が押されたら p0 を返す様にする */
  904. /*
  905. cls();
  906. printf("{%s}:(%s)-[%s]\n",s,p,p0);binkey();
  907. */
  908.                 if (v >= 0) {
  909.                     v = init_by_env_val(p);
  910.                     v0 = init_by_env_val(p0);
  911.                     if (v0 < MAX_XF) {
  912.                         fep_xf_bind_table[v] = v0;
  913.                     }
  914.                 }
  915.             }
  916.             break;
  917.         }
  918.     }
  919. }
  920.  
  921. typedef struct    VAL_UNIT {
  922.     UBYTE    name[10];
  923.     WORD    val;
  924. } VAL_UNIT;
  925.  
  926. VAL_UNIT VAL_LIST[] = {
  927. {"SP",32},
  928. {"HOME",FEP_HOME_CODE},
  929. {"DEL",FEP_DEL_CODE},
  930. {"ROLLUP",FEP_ROLLUP_CODE},{"ROLLDOWN",FEP_ROLLDN_CODE},
  931. {"LEFT",FEP_LEFTARROW_CODE},{"RIGHT",FEP_RIGHTARROW_CODE},
  932. {"UP",FEP_UPARROW_CODE},{"DOWN",FEP_DNARROW_CODE},
  933. {"CLR",0x1f},
  934. {"XF1",0x101},{"XF2",0x102},{"XF3",0x103},{"XF4",0x104},{"XF5",0x105},
  935. {"F1",0x201},{"F2",0x202},{"F3",0x203},{"F4",0x204},{"F5",0x205},
  936. {"F6",0x206},{"F7",0x207},{"F8",0x208},{"F9",0x209},{"F10",0x20a},
  937. {"SHIFT",0x10},{"CTRL",0x20},
  938. {"NULL",0},
  939.  
  940. {"DEFROME",-1},        /* 起動時はローマ字 */
  941. {"DEFKANA",-2},        /* 起動時はかな入力 */
  942. {"DEFZEN",-3},        /* 起動時は全角モード */
  943. {"DEFHIRA",-4},        /* 起動時はひらがな/カタカナ */
  944. {"DEFMEM",-5},        /* 起動時はメモリ/ディスク学習 */
  945.  
  946. {"",0}
  947. };
  948.  
  949. int
  950. init_by_env_val(STR p)
  951. {
  952.     register int i;
  953.     STR s;
  954.  
  955.     while(etc_last(p) < ' ') {
  956.         if (i = strlen(p)) {
  957.             p[i-1] = EOS;    /* 後ろのコントロールコードを削る */
  958.         } else {
  959.             break;
  960.         }
  961.     }
  962.     if (s = strchr(p,'+')) {    /* ?? + ?? である */
  963.         *s++ = EOS;
  964.         if ((i = init_by_env_val0(p)) == 0x20) {    /* ctrl だ */
  965.             i = init_by_env_val0(s);
  966.             if (('A' <= i) && (i <= 'Z')) {
  967.                 return(i-'@');
  968.             }
  969.             return(i + 0x20);
  970.         } else {
  971.             return(i + init_by_env_val0(s));
  972.         }
  973.     } else {
  974.         return(init_by_env_val0(p));
  975.     }
  976. }
  977.  
  978. int
  979. init_by_env_val0(STR p)
  980. {
  981.     register int i;
  982.     STR s;
  983.  
  984.     if (strlen(p) == 1) {    /* 長さが1のトークンなら */
  985.         return(toupper(*p));
  986. /*        return(*p - '@' - 0x20);*/
  987.     }
  988.     i = 0;
  989.     while(*(s = VAL_LIST[i].name)) {
  990.         if (!strcmp(s,p)) {
  991.             return(VAL_LIST[i].val);
  992.         }
  993.         i++;
  994.     }
  995.     return(0);
  996. }
  997.  
  998. /* s 中の '=' の左を ks に、右を kd に入れて返す */
  999. void
  1000. init_key_bind_sub(STR s,UWORD ks[],UWORD kd[])
  1001. {
  1002.     register STR p;
  1003.  
  1004.     p = strstr(s,"<<");
  1005.     *p++ = EOS;
  1006.     *p++ = EOS;
  1007.     init_key_bind_sub0(s,ks);
  1008.     init_key_bind_sub0(p,kd);
  1009.     etc_kb_change(ks,kd);
  1010. /*
  1011.     printf("{%d}",etc_kb_change(ks,kd));
  1012.     {
  1013.         int i;
  1014.         for(i=0;ks[i];i++) {
  1015.             printf("[%2x]",ks[i]);
  1016.         }
  1017.         printf("<<");
  1018.         for(i=0;kd[i];i++) {
  1019.             printf("[%2x]",kd[i]);
  1020.         }
  1021.         printf("                     \n");
  1022.     }
  1023. binkey();
  1024. */
  1025. }
  1026.  
  1027. /* s 中のつじつまの合うキーストロークを ks の中に返す */
  1028. void
  1029. init_key_bind_sub0(STR s,UWORD ks[])
  1030. {
  1031.     register int i;
  1032.     register UBYTE c;
  1033.     UBYTE d[MAXLINE];
  1034.  
  1035.     for(i=0;c = s[i];i++) {    /* 最初のスペースかタブか全角スペースを捨てる */
  1036.         if ((c == ' ') || (c == TAB)) {
  1037.             continue;
  1038.         }
  1039.         if (((c << 8) | s[i+1]) == L' ') {
  1040.             i++;
  1041.             continue;
  1042.         }
  1043.         break;
  1044.     }
  1045.     s += i;
  1046.  
  1047.     for(i=0;c = s[i];i++) {    /* 最初のスペースかタブか改行か全角スペースで切る */
  1048.         if ((c == ' ') || (c == TAB) || (c == CR) || (c == 'M'-'@')
  1049.         || (((c << 8) | s[i+1]) == L' ')) {
  1050.             s[i] = EOS;
  1051.             break;
  1052.         }
  1053.     }
  1054.  
  1055.     while(1) {
  1056.         s += init_key_bind_sub00(s,d);
  1057.         if (*d) {    /* 何か返ってきた */
  1058.             if (*d == '^') {
  1059.                 if (c = d[1]) {    /* コントロールコードだ */
  1060.                     *ks++ = c - '@';
  1061.                 } else {        /* 単体の ^ だ */
  1062.                     *ks++ = '^';
  1063.                 }
  1064.             } else if (!strcmp(d,"<NL>")) {
  1065.                     *ks++ = 'M' - '@';
  1066.             } else if (!strcmp(d,"ESC")) {
  1067.                     *ks++ = '[' - '@';
  1068.             } else if (!strcmp(d,"<SP>")) {
  1069.                     *ks++ = ' ';
  1070.             } else if (!strcmp(d,"HELP")) {
  1071.                     *ks++ = FEP_HELP_CODE;
  1072.             } else if (!strcmp(d,"INS")) {
  1073.                     *ks++ = FEP_INS_CODE;
  1074.             } else if (!strcmp(d,"DEL")) {
  1075.                     *ks++ = FEP_DEL_CODE;
  1076.             } else if (!strcmp(d,"HOME")) {
  1077.                     *ks++ = FEP_HOME_CODE;
  1078.             } else if (!strcmp(d,"CLR")) {
  1079.                     *ks++ = FEP_CLR_CODE;
  1080.             } else if (!strcmp(d,"UNDO")) {
  1081.                     *ks++ = FEP_UNDO_CODE;
  1082.             } else {
  1083.                 *ks++ = *d;
  1084.             }
  1085.         } else {
  1086.             break;
  1087.         }
  1088.     }
  1089.     *ks = 0x0000;
  1090. }
  1091.  
  1092. /* トークンを切り出す */
  1093. /* すすむべきインデックスを返す */
  1094. int
  1095. init_key_bind_sub00(STR s,STR d)
  1096. {
  1097.     UBYTE *p;
  1098.  
  1099.     strcpy(d,s);
  1100.     if (p = strchr(d,'-')) {
  1101.         if (p == d) {    /* 先頭が '-' だ */
  1102.             if (p = strchr(p+1,'-')) {
  1103.                 *p = EOS;
  1104.                 return(strlen(d)+1);
  1105.             } else {
  1106.                 return(strlen(d));
  1107.             }
  1108.         } else {
  1109.             *p = EOS;
  1110.             return(strlen(d)+1);
  1111.         }
  1112.     } else {
  1113.         return(strlen(d));
  1114.     }
  1115. }
  1116.  
  1117. /* 与えられたファイルポインタにもとづいてキーバインドを書き換える */
  1118. /* CMDMOD を参照する */
  1119. void
  1120. init_key_bind(FILE *fp)
  1121. {
  1122.     UWORD ks[MAXLINE],kd[MAXLINE];
  1123.     UBYTE s[MAXLINE];
  1124.     register int i;
  1125.  
  1126.     while(!feof(fp)) {
  1127.         fgets((char *)s,MAXLINE,fp);
  1128.         if (strstr(s,"<<")) {
  1129.             init_key_bind_sub(s,ks,kd);
  1130.         }
  1131.     }
  1132.     if (CMDMOD) {    /* ed である */
  1133.         ctrl_t_ed0();
  1134.     } else {    /* me である */
  1135.         ctrl_t_me0();
  1136.     }
  1137. }
  1138.  
  1139. UINT LED_MODE_OUT;
  1140. UINT LED_MODE;
  1141.  
  1142. /* 終了する時などに呼び出す */
  1143. void
  1144. init_exit()
  1145. {
  1146.     UINT w;
  1147.  
  1148.     disp_cursor_on();
  1149.     fep_init_exit();
  1150. /*    fep_ledset(first_led);*/
  1151.      under_blanc();
  1152.     etc_func_on0();
  1153.     fcloseall();
  1154.     etc_color(NORMAL);
  1155.  
  1156.     B_CONSOL(0,0,XWIDTH0-1,YWIDTH0-2);
  1157.     B_LOCATE(0,YWIDTH0-2);
  1158.  
  1159.     w = 0;
  1160.     if (LED_MODE & 0x400) {
  1161.         w |= 0x4;
  1162.     }
  1163.     if (LED_MODE & 0x200) {
  1164.         w |= 0x2;
  1165.     }
  1166.     if (LED_MODE & 0x20) {
  1167.         w |= 0x1;
  1168.     }
  1169.     KNJCTRL(1,1);
  1170.     KNJCTRL(5,w);
  1171.     KNJCTRL(1,0);
  1172.  
  1173.     init_omajinai();
  1174. }
  1175.  
  1176.  
  1177. /* 終了する時などに呼び出す */
  1178. void
  1179. init_omajinai()
  1180. {
  1181.     UINT w;
  1182.     register int i,m,mask;
  1183.  
  1184.     m = LED_MODE_OUT >> 4;
  1185.     for(mask=1,i=0;i<=6;i++,mask<<=1) {
  1186.         if (m & mask) {
  1187.             LEDMOD(i,0);
  1188.             KNJCTRL(53);
  1189.             LEDMOD(i,1);
  1190.             KNJCTRL(53);
  1191.         } else {
  1192.             LEDMOD(i,1);
  1193.             KNJCTRL(53);
  1194.             LEDMOD(i,0);
  1195.             KNJCTRL(53);
  1196.         }
  1197.     }
  1198. }
  1199.  
  1200.